﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using WindowsFormApplication.FormBase;
using WindowsFormsModel.BusinessObjects;
using WindowsFormsView;
using WindowsFormsPresenter.RestaurantMenuNorm;
using WindowsFormsPresenter.RestaurantMenu;
using Utils;
using WindowsFormsPresenter.InventoryItem;
using WindowsFormsPresenter.Unit;

namespace WindowsFormApplication.FormCategory
{
    public partial class frmRestaurantMenuNormDetail : frmBaseCategoryDetail, IRestaurantMenuNormView, IRestaurantMenusView, IInventoryItemsView, IUnitsView
    {
        private RestaurantMenuNormPresenter _restaurantMenuNormPresenter;
        private RestaurantMenusPresenter _restaurantMenusPresenter;
        private InventoryItemsPresenter _inventoryItemsPresenter;
        private UnitsPresenter _unitsPresenter;

        public string MenuNormID { get; set; }

        public string MenuNormCode
        {
            get { return txtMenuNormCode.Text; }
            set { txtMenuNormCode.Text = value; }
        }

        public string MenuNormName
        {
            get { return txtMenuNormName.Text; }
            set { txtMenuNormName.Text = value; }
        }

        public string Description
        {
            get { return txtDescription.Text; }
            set { txtDescription.Text = value; }
        }

        public string MenuID
        {
            get { return cboMenuID.Value.ToString(); }
            set { cboMenuID.Value = value; }
        }

        public string RestaurantID { get; set; }

        public IList<UnitModel> Units
        {
            set
            {
                var units = value;

                cboUnitID.DataSource = units;
                cboUnitID.DisplayMember = "UnitName";
                cboUnitID.ValueMember = "UnitID";
            }
        }

        public IList<InventoryItemModel> InventoryItems
        {
            set
            {
                var inventoryItems = value;

                cboInventoryItemID.DataSource = inventoryItems;
                cboInventoryItemID.DisplayMember = "InventoryItemCode";
                cboInventoryItemID.ValueMember = "InventoryItemID";

                for (int i = 0; i < cboInventoryItemID.DisplayLayout.Bands[0].Columns.Count; i++)
                {
                    cboInventoryItemID.DisplayLayout.Bands[0].Columns[i].Hidden = true;
                }

                cboInventoryItemID.DisplayLayout.Bands[0].Columns["InventoryItemCode"].Hidden = false;
                cboInventoryItemID.DisplayLayout.Bands[0].Columns["InventoryItemName"].Hidden = false;
                cboInventoryItemID.DisplayLayout.Bands[0].Columns["UnitPrice"].Hidden = false;

                cboInventoryItemID.DisplayLayout.Bands[0].Columns["InventoryItemCode"].Header.Caption = "Mã nguyên liệu";
                cboInventoryItemID.DisplayLayout.Bands[0].Columns["InventoryItemName"].Header.Caption = "Tên nguyên liệu";
                cboInventoryItemID.DisplayLayout.Bands[0].Columns["UnitPrice"].Header.Caption = "Giá nhập";
            }
        }

        public IList<RestaurantMenuNormDetailModel> RestaurantMenuNormDetails
        {
            get
            {
                List<RestaurantMenuNormDetailModel> restaurantMenuNormDetailModels = new List<RestaurantMenuNormDetailModel>();
                if (grdMain.DataSource != null && grdMain.Rows.Count > 0)
                {
                    foreach (var row in grdMain.Rows)
                    {
                        restaurantMenuNormDetailModels.Add(new RestaurantMenuNormDetailModel
                        {
                            MenuNormDetailID = null,
                            MenuNormID = null,
                            InventoryItemID = row.Cells["InventoryItemID"].Value.ToString(),
                            InventoryItemName = row.Cells["InventoryItemName"].Value.ToString(),
                            UnitID = row.Cells["UnitID"].Value.ToString(),
                            UnitPrice = decimal.Parse(row.Cells["UnitPrice"].Value.ToString()),
                            RestaurantID = null,
                            Quantity = float.Parse(row.Cells["Quantity"].Value.ToString()),
                        });
                    }
                }

                return restaurantMenuNormDetailModels.ToList();
            }
            set
            {
                DataSet ds = new DataSet();
                ds = value.AsDataSet("RestaurantMenuNormDetail");

                grdMain.DataSource = ds.Tables["RestaurantMenuNormDetail"];
                for (int i = 0; i < grdMain.DisplayLayout.Bands[0].Columns.Count; i++) { grdMain.DisplayLayout.Bands[0].Columns[i].Hidden = true; }
                grdMain.DisplayLayout.Bands[0].Columns["InventoryItemID"].Hidden = false;
                grdMain.DisplayLayout.Bands[0].Columns["InventoryItemName"].Hidden = false;
                grdMain.DisplayLayout.Bands[0].Columns["UnitID"].Hidden = false;
                grdMain.DisplayLayout.Bands[0].Columns["UnitPrice"].Hidden = false;
                grdMain.DisplayLayout.Bands[0].Columns["Quantity"].Hidden = false;


                grdMain.DisplayLayout.Bands[0].Columns["InventoryItemID"].Header.Caption = "Mã nguyên liệu";
                grdMain.DisplayLayout.Bands[0].Columns["InventoryItemName"].Header.Caption = "Tên nguyên liệu";
                grdMain.DisplayLayout.Bands[0].Columns["UnitID"].Header.Caption = "Đơn vị tính";
                grdMain.DisplayLayout.Bands[0].Columns["UnitPrice"].Header.Caption = "Giá nhập";
                grdMain.DisplayLayout.Bands[0].Columns["Quantity"].Header.Caption = "Số lượng";

                grdMain.DisplayLayout.Bands[0].Columns["InventoryItemName"].CellActivation = Infragistics.Win.UltraWinGrid.Activation.NoEdit;
                grdMain.DisplayLayout.Bands[0].Columns["UnitID"].CellActivation = Infragistics.Win.UltraWinGrid.Activation.NoEdit;
                grdMain.DisplayLayout.Bands[0].Columns["UnitPrice"].CellActivation = Infragistics.Win.UltraWinGrid.Activation.NoEdit;

                grdMain.DisplayLayout.Bands[0].Columns["InventoryItemID"].EditorComponent = cboInventoryItemID;
                grdMain.DisplayLayout.Bands[0].Columns["UnitID"].EditorComponent = cboUnitID;

                grdMain.DisplayLayout.Bands[0].Columns["UnitPrice"].Format = "#,###,###,###,###";
                grdMain.DisplayLayout.Bands[0].Columns["Quantity"].Format = "#,###,###,###,##0.##";

                grdMain.DisplayLayout.Bands[0].Columns["InventoryItemID"].Header.VisiblePosition = 0;
                grdMain.DisplayLayout.Bands[0].Columns["InventoryItemName"].Header.VisiblePosition = 1;
                grdMain.DisplayLayout.Bands[0].Columns["UnitID"].Header.VisiblePosition = 3;
                grdMain.DisplayLayout.Bands[0].Columns["UnitPrice"].Header.VisiblePosition = 4;
                grdMain.DisplayLayout.Bands[0].Columns["Quantity"].Header.VisiblePosition = 2;
            }
        }

        public IList<RestaurantMenuModel> RestaurantMenus
        {
            set
            {
                var restaurantMenus = value;

                cboMenuID.DataSource = restaurantMenus;
                cboMenuID.DisplayMember = "MenuCode";
                cboMenuID.ValueMember = "MenuID";

                for (int i = 0; i < cboMenuID.DisplayLayout.Bands[0].Columns.Count; i++)
                {
                    cboMenuID.DisplayLayout.Bands[0].Columns[i].Hidden = true;
                }

                cboMenuID.DisplayLayout.Bands[0].Columns["MenuCode"].Hidden = false;
                cboMenuID.DisplayLayout.Bands[0].Columns["MenuName"].Hidden = false;
                cboMenuID.DisplayLayout.Bands[0].Columns["SalesPrice"].Hidden = false;

                cboMenuID.DisplayLayout.Bands[0].Columns["MenuCode"].Header.Caption = "Mã thực đơn";
                cboMenuID.DisplayLayout.Bands[0].Columns["MenuName"].Header.Caption = "Tên thực đơn";
                cboMenuID.DisplayLayout.Bands[0].Columns["SalesPrice"].Header.Caption = "Giá bán";

                //if (restaurantMenus.Count > 0)
                //    cboMenuID.Rows[0].Selected = true;
            }
        }

        protected override void InitData()
        {
            _restaurantMenusPresenter.DisplayActiveByBranch();
            _inventoryItemsPresenter.DisplayActiveByBranch(true);
            _unitsPresenter.DisplayActive();

            if (KeyValue != null && KeyValue != "")
                _restaurantMenuNormPresenter.Display(KeyValue);
            else
                _restaurantMenuNormPresenter.Display("");
        }

        protected override bool ValidData()
        {
            var restaurantMenuNormDetails = RestaurantMenuNormDetails;

            if (string.IsNullOrEmpty(MenuNormCode))
            {
                ShowMessageBox("Bạn chưa nhập mã định mức nguyên liệu !", "Thông báo thay đổi dữ liệu !", MessageBoxButtons.OK, MessageBoxIcon.Error);
                txtMenuNormCode.Focus();
                return false;
            }
            if (string.IsNullOrEmpty(MenuNormName))
            {
                ShowMessageBox("Bạn chưa nhập tên định mức nguyên liệu !", "Thông báo thay đổi dữ liệu !", MessageBoxButtons.OK, MessageBoxIcon.Error);
                txtMenuNormName.Focus();
                return false;
            }
            if (cboMenuID.Value == null)
            {
                ShowMessageBox("Bạn chưa nhập thực đơn cần định lượng !", "Thông báo thay đổi dữ liệu !", MessageBoxButtons.OK, MessageBoxIcon.Error);
                cboMenuID.Focus();
                return false;
            }
            if (restaurantMenuNormDetails.Count <= 0)
            {
                ShowMessageBox("Bạn chưa nhập danh sách nguyên liệu đinh mức !", "Thông báo thay đổi dữ liệu !", MessageBoxButtons.OK, MessageBoxIcon.Error);
                grdMain.Focus();
                return false;
            }
            else
            {
                foreach (var item in restaurantMenuNormDetails)
                {
                    var itemNumber = from r in RestaurantMenuNormDetails
                                     where r.InventoryItemID == item.InventoryItemID
                                     select r.InventoryItemID;

                    if (itemNumber.Count() > 1)
                    {
                        ShowMessageBox("Danh sách nguyên liệu định mức không được có nguyên liệu trùng nhau !", "Thông báo thay đổi dữ liệu !", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        grdMain.Focus();
                        return false;
                    }
                }
            }
            return true;
        }

        protected override bool SaveData()
        {
            try
            {
                if (eActionMode == ActionMode.AddNew)
                {
                    _restaurantMenuNormPresenter.Save();
                    ShowMessageBox("Thêm mới dữ liệu thành công !", "Thông báo thay đổi dữ liệu !", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                else
                {
                    _restaurantMenuNormPresenter.Save();
                    ShowMessageBox("Sửa dữ liệu thành công !", "Thông báo thay đổi dữ liệu !", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
            catch (ApplicationException ex)
            {
                ShowMessageBox(ex.Message, "Thông báo thay đổi dữ liệu !", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }
            return true;
        }

        public frmRestaurantMenuNormDetail()
        {
            InitializeComponent();

            _restaurantMenuNormPresenter = new RestaurantMenuNormPresenter(this);
            _restaurantMenusPresenter = new RestaurantMenusPresenter(this);
            _inventoryItemsPresenter = new InventoryItemsPresenter(this);
            _unitsPresenter = new UnitsPresenter(this);
        }

        private void cboMenuID_ValueChanged(object sender, EventArgs e)
        {
            if (cboMenuID.IsItemInList() && cboMenuID.Value != null)
                txtMenuName.Text = cboMenuID.ActiveRow.Cells["MenuName"].Value.ToString();
        }

        private void cboInventoryItemID_ValueChanged(object sender, EventArgs e)
        {
            if (cboInventoryItemID.IsItemInList() && cboInventoryItemID.Value != null)
            {
                grdMain.ActiveRow.Cells["InventoryItemName"].Value = cboInventoryItemID.ActiveRow.Cells["InventoryItemName"].Value;
                grdMain.ActiveRow.Cells["UnitID"].Value = cboInventoryItemID.ActiveRow.Cells["UnitID"].Value;
                grdMain.ActiveRow.Cells["UnitPrice"].Value = cboInventoryItemID.ActiveRow.Cells["UnitPrice"].Value;
                grdMain.ActiveRow.Cells["Quantity"].Value = 0;
            }
        }

        private void btnDelete_Click(object sender, EventArgs e)
        {
            try
            {
                if (grdMain.ActiveRow != null)
                    grdMain.ActiveRow.Delete(false);
            }
            catch (Exception ex) { ShowMessageBox(ex.Message, "Thông báo thay đổi dữ liệu !", MessageBoxButtons.OK, MessageBoxIcon.Error); }
        }

        private void grdMain_CellDataError(object sender, Infragistics.Win.UltraWinGrid.CellDataErrorEventArgs e)
        {
            if (!e.ForceExit)
            {
                e.StayInEditMode = true;
                e.RaiseErrorEvent = false;

                switch (grdMain.ActiveCell.Column.Key)
                {
                    case "Quantity":
                        if (grdMain.ActiveCell.Column.DataType == typeof(float))
                            ShowMessageBox("Số lượng phải là kiểu số !", "Thông báo thay đổi dữ liệu !", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        break;
                    default:
                        break;
                }
            }
            else { e.RaiseErrorEvent = false; }
        }
    }
}
